home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / playerselect.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  12KB  |  532 lines

  1. #include "stdafx.h"
  2.  
  3. #include <process.h>
  4.  
  5. #include "PlayerSelect.h"
  6.  
  7. CPlayerSelect::CPlayerSelect(CWnd* pParent)
  8.     : CDialog(CPlayerSelect::IDD, pParent)
  9. {
  10.     //{{AFX_DATA_INIT(CPlayerSelect)
  11.     m_Pl1Selected = FALSE;
  12.     m_Pl1Name = _T("");
  13.     m_Pl2Selected = FALSE;
  14.     m_Pl2Name = _T("");
  15.     m_Pl3Selected = FALSE;
  16.     m_Pl3Name = _T("");
  17.     m_Pl4Selected = FALSE;
  18.     m_Pl4Name = _T("");
  19.     m_Pl5Selected = FALSE;
  20.     m_Pl5Name = _T("");
  21.     m_Pl6Selected = FALSE;
  22.     m_Pl6Name = _T("");
  23.     m_Pl7Selected = FALSE;
  24.     m_Pl7Name = _T("");
  25.     m_Pl8Selected = FALSE;
  26.     m_Pl8Name = _T("");
  27.     //}}AFX_DATA_INIT
  28.  
  29.     // Set names
  30.     
  31.     m_Pl1Name = pl_name[0];
  32.     m_Pl2Name = pl_name[1];
  33.     m_Pl3Name = pl_name[2];
  34.     m_Pl4Name = pl_name[3];
  35.     m_Pl5Name = pl_name[4];
  36.     m_Pl6Name = pl_name[5];
  37.     m_Pl7Name = pl_name[6];
  38.     m_Pl8Name = pl_name[7];
  39.     
  40.     // Set selected
  41.  
  42.     m_Pl1Selected = pl_selected[0];
  43.     m_Pl2Selected = pl_selected[1];
  44.     m_Pl3Selected = pl_selected[2];
  45.     m_Pl4Selected = pl_selected[3];
  46.     m_Pl5Selected = pl_selected[4];
  47.     m_Pl6Selected = pl_selected[5];
  48.     m_Pl7Selected = pl_selected[6];
  49.     m_Pl8Selected = pl_selected[7];
  50. }
  51.  
  52. CPlayerSelect::~CPlayerSelect()
  53. {
  54. }
  55.  
  56. void CPlayerSelect::DoDataExchange(CDataExchange* pDX)
  57. {
  58.     CDialog::DoDataExchange(pDX);
  59.  
  60.     //{{AFX_DATA_MAP(CPlayerSelect)
  61.     DDX_Check(pDX, IDC_PL1CHECK, m_Pl1Selected);
  62.     DDX_Text(pDX, IDC_PL1NAME, m_Pl1Name);
  63.     DDV_MaxChars(pDX, m_Pl1Name, 15);
  64.     DDX_Check(pDX, IDC_PL2CHECK, m_Pl2Selected);
  65.     DDX_Text(pDX, IDC_PL2NAME, m_Pl2Name);
  66.     DDV_MaxChars(pDX, m_Pl2Name, 15);
  67.     DDX_Check(pDX, IDC_PL3CHECK, m_Pl3Selected);
  68.     DDX_Text(pDX, IDC_PL3NAME, m_Pl3Name);
  69.     DDV_MaxChars(pDX, m_Pl3Name, 15);
  70.     DDX_Check(pDX, IDC_PL4CHECK, m_Pl4Selected);
  71.     DDX_Text(pDX, IDC_PL4NAME, m_Pl4Name);
  72.     DDV_MaxChars(pDX, m_Pl4Name, 15);
  73.     DDX_Check(pDX, IDC_PL5CHECK, m_Pl5Selected);
  74.     DDX_Text(pDX, IDC_PL5NAME, m_Pl5Name);
  75.     DDV_MaxChars(pDX, m_Pl5Name, 15);
  76.     DDX_Check(pDX, IDC_PL6CHECK, m_Pl6Selected);
  77.     DDX_Text(pDX, IDC_PL6NAME, m_Pl6Name);
  78.     DDV_MaxChars(pDX, m_Pl6Name, 15);
  79.     DDX_Check(pDX, IDC_PL7CHECK, m_Pl7Selected);
  80.     DDX_Text(pDX, IDC_PL7NAME, m_Pl7Name);
  81.     DDV_MaxChars(pDX, m_Pl7Name, 15);
  82.     DDX_Check(pDX, IDC_PL8CHECK, m_Pl8Selected);
  83.     DDX_Text(pDX, IDC_PL8NAME, m_Pl8Name);
  84.     DDV_MaxChars(pDX, m_Pl8Name, 15);
  85.     //}}AFX_DATA_MAP
  86. }
  87.  
  88. BEGIN_MESSAGE_MAP(CPlayerSelect, CDialog)
  89.     //{{AFX_MSG_MAP(CPlayerSelect)
  90.     ON_BN_CLICKED(IDC_PL4CONFIGURE, OnPl4Configure)
  91.     ON_BN_CLICKED(IDC_PL1CONFIGURE, OnPl1Configure)
  92.     ON_BN_CLICKED(IDC_PL2CONFIGURE, OnPl2Configure)
  93.     ON_BN_CLICKED(IDC_PL3CONFIGURE, OnPl3Configure)
  94.     ON_BN_CLICKED(IDC_PL5CONFIGURE, OnPl5Configure)
  95.     ON_BN_CLICKED(IDC_PL6CONFIGURE, OnPl6Configure)
  96.     ON_WM_DESTROY()
  97.     ON_BN_CLICKED(IDC_PL7CONFIGURE, OnPl7Configure)
  98.     ON_BN_CLICKED(IDC_PL8CONFIGURE, OnPl8Configure)
  99.     //}}AFX_MSG_MAP
  100. END_MESSAGE_MAP()
  101.  
  102. void CPlayerSelect::OnDestroy() 
  103. {
  104.     CDialog::OnDestroy();
  105.  
  106.     // Save names
  107.  
  108.     strcpy(pl_name[0], m_Pl1Name);
  109.     strcpy(pl_name[1], m_Pl2Name);
  110.     strcpy(pl_name[2], m_Pl3Name);
  111.     strcpy(pl_name[3], m_Pl4Name);
  112.     strcpy(pl_name[4], m_Pl5Name);
  113.     strcpy(pl_name[5], m_Pl6Name);
  114.     strcpy(pl_name[6], m_Pl7Name);
  115.     strcpy(pl_name[7], m_Pl8Name);
  116.     
  117.     // Save selected
  118.  
  119.     pl_selected[0] = m_Pl1Selected;
  120.     pl_selected[1] = m_Pl2Selected;
  121.     pl_selected[2] = m_Pl3Selected;
  122.     pl_selected[3] = m_Pl4Selected;
  123.     pl_selected[4] = m_Pl5Selected;
  124.     pl_selected[5] = m_Pl6Selected;    
  125.     pl_selected[6] = m_Pl7Selected;    
  126.     pl_selected[7] = m_Pl8Selected;    
  127. }
  128.  
  129. void CPlayerSelect::OnPl1Configure() 
  130. {
  131.     CKeySetup k(0);
  132.     k.DoModal();
  133. }
  134.  
  135. void CPlayerSelect::OnPl2Configure() 
  136. {
  137.     CKeySetup k(1);
  138.     k.DoModal();
  139. }
  140.  
  141. void CPlayerSelect::OnPl3Configure() 
  142. {
  143.     CKeySetup k(2);
  144.     k.DoModal();
  145. }
  146.  
  147. void CPlayerSelect::OnPl4Configure() 
  148. {    
  149.     CMouseSetup m;
  150.     m.DoModal();
  151. }
  152.  
  153. void CPlayerSelect::OnPl5Configure() 
  154. {
  155.     CJoySetup j(0);
  156.     j.DoModal();
  157. }
  158.  
  159. void CPlayerSelect::OnPl6Configure() 
  160. {
  161.     CJoySetup j(1);
  162.     j.DoModal();
  163. }
  164.  
  165.  
  166. void CPlayerSelect::OnPl7Configure() 
  167. {
  168.     CJoySetup j(2);
  169.     j.DoModal();
  170. }
  171.  
  172. void CPlayerSelect::OnPl8Configure() 
  173. {
  174.     CJoySetup j(3);
  175.     j.DoModal();
  176. }
  177.  
  178. CKeySetup::CKeySetup(int _n, CWnd* pParent)
  179.     : CDialog(CKeySetup::IDD, pParent)
  180. {
  181.     //{{AFX_DATA_INIT(CKeySetup)
  182.     //}}AFX_DATA_INIT
  183.  
  184.     n = _n;
  185. }
  186.  
  187. void CKeySetup::DoDataExchange(CDataExchange* pDX)
  188. {
  189.     CDialog::DoDataExchange(pDX);
  190.     //{{AFX_DATA_MAP(CKeySetup)
  191.     DDX_Control(pDX, IDC_KEY_UP, m_Up);
  192.     DDX_Control(pDX, IDC_KEY_RIGHT, m_Right);
  193.     DDX_Control(pDX, IDC_KEY_LEFT, m_Left);
  194.     DDX_Control(pDX, IDC_KEY_FIRE, m_Fire);
  195.     DDX_Control(pDX, IDC_KEY_DOWN, m_Down);
  196.     //}}AFX_DATA_MAP
  197. }
  198.  
  199. BEGIN_MESSAGE_MAP(CKeySetup, CDialog)
  200.     //{{AFX_MSG_MAP(CKeySetup)
  201.     //}}AFX_MSG_MAP
  202. END_MESSAGE_MAP()
  203.  
  204. BOOL CKeySetup::OnInitDialog() 
  205. {
  206.     LPDIRECTINPUTDEVICE2 keyboard;
  207.     DIDEVICEOBJECTINSTANCE didoi;
  208.     int idx;
  209.  
  210.     CDialog::OnInitDialog();
  211.     
  212.     // Clear combo boxes
  213.  
  214.     m_Left.ResetContent();
  215.     m_Right.ResetContent();
  216.     m_Up.ResetContent();
  217.     m_Down.ResetContent();
  218.     m_Fire.ResetContent();
  219.  
  220.     // Fill combo boxes with available buttons
  221.  
  222.     keyboard = create_input_device_keyboard();
  223.     didoi.dwSize = sizeof(didoi);
  224.  
  225.     for (DWORD dwOfs = 0; dwOfs < 256; dwOfs++)
  226.         if (SUCCEEDED(keyboard->GetObjectInfo(&didoi, dwOfs, DIPH_BYOFFSET)))
  227.         {
  228.             // Add button to Left list
  229.  
  230.             idx = m_Left.AddString(didoi.tszName);
  231.  
  232.             m_Left.SetItemData(idx, dwOfs);
  233.  
  234.             if (key_left[n] == dwOfs)
  235.                 m_Left.SetCurSel(idx);
  236.  
  237.             // Add button to Right list
  238.  
  239.             idx = m_Right.AddString(didoi.tszName);
  240.  
  241.             m_Right.SetItemData(idx, dwOfs);
  242.  
  243.             if (key_right[n] == dwOfs)
  244.                 m_Right.SetCurSel(idx);
  245.  
  246.             // Add button to Up list
  247.  
  248.             idx = m_Up.AddString(didoi.tszName);
  249.  
  250.             m_Up.SetItemData(idx, dwOfs);
  251.  
  252.             if (key_up[n] == dwOfs)
  253.                 m_Up.SetCurSel(idx);
  254.  
  255.             // Add button to Down list
  256.  
  257.             idx = m_Down.AddString(didoi.tszName);
  258.  
  259.             m_Down.SetItemData(idx, dwOfs);
  260.  
  261.             if (key_down[n] == dwOfs)
  262.                 m_Down.SetCurSel(idx);
  263.  
  264.             // Add button to Fire list
  265.  
  266.             idx = m_Fire.AddString(didoi.tszName);
  267.  
  268.             m_Fire.SetItemData(idx, dwOfs);
  269.  
  270.             if (key_fire[n] == dwOfs)
  271.                 m_Fire.SetCurSel(idx);            
  272.         }
  273.  
  274.     keyboard->Release();
  275.  
  276.     return TRUE;
  277. }
  278.  
  279. void CKeySetup::OnOK() 
  280. {
  281.     key_left[n] = m_Left.GetItemData(m_Left.GetCurSel());
  282.     key_right[n] = m_Right.GetItemData(m_Right.GetCurSel());
  283.     key_up[n] = m_Up.GetItemData(m_Up.GetCurSel());
  284.     key_down[n] = m_Down.GetItemData(m_Down.GetCurSel());
  285.     key_fire[n] = m_Fire.GetItemData(m_Fire.GetCurSel());
  286.         
  287.     CDialog::OnOK();
  288. }
  289.  
  290. CMouseSetup::CMouseSetup(CWnd* pParent)
  291.     : CDialog(CMouseSetup::IDD, pParent)
  292. {
  293.     //{{AFX_DATA_INIT(CMouseSetup)
  294.     //}}AFX_DATA_INIT
  295. }
  296.  
  297. void CMouseSetup::DoDataExchange(CDataExchange* pDX)
  298. {
  299.     CDialog::DoDataExchange(pDX);
  300.     //{{AFX_DATA_MAP(CMouseSetup)
  301.     DDX_Control(pDX, IDC_MOUSE_REVERSE, m_Reverse);
  302.     //}}AFX_DATA_MAP
  303. }
  304.  
  305. BEGIN_MESSAGE_MAP(CMouseSetup, CDialog)
  306.     //{{AFX_MSG_MAP(CMouseSetup)
  307.     //}}AFX_MSG_MAP
  308. END_MESSAGE_MAP()
  309.  
  310. BOOL CMouseSetup::OnInitDialog() 
  311. {
  312.     CDialog::OnInitDialog();
  313.  
  314.     m_Reverse.SetCheck(reverse_mouse);    
  315.     
  316.     return TRUE;
  317. }
  318.  
  319. void CMouseSetup::OnOK() 
  320. {
  321.     reverse_mouse = m_Reverse.GetCheck();
  322.     
  323.     CDialog::OnOK();
  324. }
  325.  
  326. CJoySetup::CJoySetup(int _n, CWnd* pParent)
  327.     : CDialog(CJoySetup::IDD, pParent)
  328. {
  329.     //{{AFX_DATA_INIT(CJoySetup)
  330.     //}}AFX_DATA_INIT
  331.  
  332.     n = _n;
  333.  
  334.     fire = joy_fire[n];
  335.     jetpack = joy_jetpack[n];
  336.     mine = joy_mine[n];
  337. }
  338.  
  339. void CJoySetup::DoDataExchange(CDataExchange* pDX)
  340. {
  341.     CDialog::DoDataExchange(pDX);
  342.     //{{AFX_DATA_MAP(CJoySetup)
  343.     DDX_Control(pDX, IDC_JOY_MINE, m_Mine);
  344.     DDX_Control(pDX, IDC_JOY_JETPACK, m_Jetpack);
  345.     DDX_Control(pDX, IDC_JOY_FIRE, m_Fire);
  346.     DDX_Control(pDX, IDC_JOY_DEVICE, m_Device);
  347.     //}}AFX_DATA_MAP
  348. }
  349.  
  350. BEGIN_MESSAGE_MAP(CJoySetup, CDialog)
  351.     //{{AFX_MSG_MAP(CJoySetup)
  352.     ON_BN_CLICKED(IDC_CALIBRATE_JOYSTICK, OnCalibrateJoystick)
  353.     ON_WM_DESTROY()
  354.     ON_CBN_SELCHANGE(IDC_JOY_DEVICE, OnSelchangeJoyDevice)
  355.     //}}AFX_MSG_MAP
  356. END_MESSAGE_MAP()
  357.  
  358. void CJoySetup::OnCalibrateJoystick() 
  359. {
  360.     _spawnlp(_P_NOWAIT, "CONTROL", "CONTROL", "JOY.CPL", 0);    
  361. }
  362.  
  363. static BOOL CALLBACK DIEnumDevicesProc(LPCDIDEVICEINSTANCE lpddi, LPVOID _joysetup)
  364. {
  365.     CJoySetup *joysetup = (CJoySetup *)_joysetup;
  366.  
  367.     // Add string to combobox
  368.  
  369.     int idx = joysetup->m_Device.AddString(lpddi->tszInstanceName);
  370.  
  371.     // Allocate new GUID
  372.  
  373.     GUID *g = new GUID(lpddi->guidInstance);
  374.  
  375.     // Associate GUID with device in combobox
  376.  
  377.     joysetup->m_Device.SetItemDataPtr(idx, g);
  378.  
  379.     return DIENUM_CONTINUE;   
  380. }
  381.  
  382. BOOL CJoySetup::OnInitDialog() 
  383. {
  384.     CDialog::OnInitDialog();
  385.     
  386.     // Add option none
  387.  
  388.     m_Device.SetItemDataPtr(m_Device.AddString(SELECTION_NONE), (LPVOID)0xffffffff);
  389.  
  390.     // Get attached joysticks
  391.  
  392.     DI->EnumDevices(DIDEVTYPE_JOYSTICK, DIEnumDevicesProc, this, DIEDFL_ATTACHEDONLY);    
  393.  
  394.     // Select one or select default
  395.  
  396.     m_Device.SelectString(0, joy_str[n]);
  397.  
  398.     if (m_Device.GetCurSel() == -1)
  399.         m_Device.SelectString(0, SELECTION_NONE);
  400.     
  401.     // Populate the lists for buttons
  402.  
  403.     PopulateButtonList();
  404.  
  405.     return TRUE;
  406. }
  407.  
  408. void CJoySetup::PopulateButtonList()
  409. {
  410.     LPDIRECTINPUTDEVICE2 joystick;
  411.     DIDEVICEOBJECTINSTANCE didoi;
  412.     int idx;
  413.  
  414.     // Reset combo boxes
  415.  
  416.     m_Fire.ResetContent();
  417.     m_Jetpack.ResetContent();
  418.     m_Mine.ResetContent();
  419.     
  420.     // Get GUID of joystick
  421.  
  422.     GUID *g = (GUID *)m_Device.GetItemDataPtr(m_Device.GetCurSel());
  423.  
  424.     if (g == (GUID *)0xffffffff)
  425.         return;
  426.  
  427.     // Fill boxes with available buttons
  428.  
  429.     joystick = create_input_device_joystick(g);
  430.     didoi.dwSize = sizeof(didoi);
  431.  
  432.     for (int b = 0; b < 32; b++)
  433.     {
  434.         DWORD dwOfs = DIJOFS_BUTTON(b);
  435.  
  436.         if (SUCCEEDED(joystick->GetObjectInfo(&didoi, dwOfs, DIPH_BYOFFSET)))
  437.         {
  438.             // Add button to Fire list
  439.  
  440.             idx = m_Fire.AddString(didoi.tszName);
  441.  
  442.             m_Fire.SetItemData(idx, dwOfs);
  443.  
  444.             if (fire == dwOfs)
  445.                 m_Fire.SetCurSel(idx);
  446.  
  447.             // Add button to Jetpack list
  448.  
  449.             idx = m_Jetpack.AddString(didoi.tszName);
  450.  
  451.             m_Jetpack.SetItemData(idx, dwOfs);
  452.  
  453.             if (jetpack == dwOfs)
  454.                 m_Jetpack.SetCurSel(idx);
  455.  
  456.             // Add button to Mine list
  457.  
  458.             idx = m_Mine.AddString(didoi.tszName);
  459.  
  460.             m_Mine.SetItemData(idx, dwOfs);
  461.  
  462.             if (mine == dwOfs)
  463.                 m_Mine.SetCurSel(idx);
  464.         }
  465.     }
  466.  
  467.     joystick->Release();
  468.  
  469.     // Mine button is not required
  470.  
  471.     m_Mine.SetItemData(m_Mine.AddString(SELECTION_NONE), -1);
  472.  
  473.     // Make sure something is selected for Mine
  474.  
  475.     if (m_Mine.GetCurSel() == -1)
  476.         m_Mine.SelectString(0, SELECTION_NONE);    
  477. }
  478.  
  479. void CJoySetup::OnDestroy() 
  480. {
  481.     CDialog::OnDestroy();
  482.  
  483.     // Delete allocated GUID's
  484.     
  485.     for (int idx = m_Device.GetCount() - 1; idx >= 0; idx--)
  486.         if (m_Device.GetItemDataPtr(idx) != (LPVOID)0xffffffff)
  487.             delete (GUID *)m_Device.GetItemDataPtr(idx);
  488. }
  489.  
  490. void CJoySetup::OnSelchangeJoyDevice() 
  491. {
  492.     fire = DIJOFS_BUTTON0;
  493.     jetpack = DIJOFS_BUTTON1;
  494.     mine = DIJOFS_BUTTON2;
  495.  
  496.     PopulateButtonList();
  497. }
  498.  
  499. void CJoySetup::OnOK() 
  500. {
  501.     CDialog::OnOK();
  502.  
  503.     // Delete old GUID
  504.  
  505.     safe_delete(&joy_guid[n]);
  506.  
  507.     // Check if anything was selected
  508.  
  509.     GUID *g = (GUID *)m_Device.GetItemDataPtr(m_Device.GetCurSel());
  510.  
  511.     if (g == (GUID *)0xffffffff)
  512.     {
  513.         // Select no joystick
  514.  
  515.         strcpy(joy_str[n], "");
  516.  
  517.         joy_guid[n] = 0;
  518.  
  519.         return;
  520.     }
  521.  
  522.     // Copy settings
  523.  
  524.     m_Device.GetLBText(m_Device.GetCurSel(), joy_str[n]);
  525.  
  526.     joy_guid[n] = new GUID(*g);
  527.  
  528.     joy_fire[n] = m_Fire.GetItemData(m_Fire.GetCurSel());
  529.     joy_jetpack[n] = m_Jetpack.GetItemData(m_Jetpack.GetCurSel());
  530.     joy_mine[n] = m_Mine.GetItemData(m_Mine.GetCurSel());
  531. }
  532.